package cn.edu.bzu.aaa.dao;

import cn.edu.bzu.aaa.model.User;
import cn.edu.bzu.aaa.until.C3P0Util;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

public class UserDAO {

    /**
     * 获取所有用户记录。
     *
     * @return 包含所有用户记录的列表。
     */
    public List<User> getAll() {
        List<User> list = new ArrayList<>();
        try (Connection conn = C3P0Util.getConnection();
             PreparedStatement ps = conn.prepareStatement("SELECT * FROM users")) {
            ResultSet rs = ps.executeQuery();
            while (rs.next()) {
                list.add(populateUser(rs));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return list;
    }

    /**
     * 根据ID获取特定的用户记录。
     *
     * @param id 用户记录的ID。
     * @return 对应ID的用户记录，如果不存在则返回null。
     */
    public User getByID(int id) {
        try (Connection conn = C3P0Util.getConnection();
             PreparedStatement ps = conn.prepareStatement("SELECT * FROM users WHERE UserID = ?")) {
            ps.setInt(1, id);
            ResultSet rs = ps.executeQuery();
            if (rs.next()) {
                return populateUser(rs);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 根据用户名获取特定的用户记录。
     *
     * @param username 用户名。
     * @return 对应用户名的用户记录，如果不存在则返回null。
     */
    public User getByUsername(String username) {
        try (Connection conn = C3P0Util.getConnection();
             PreparedStatement ps = conn.prepareStatement("SELECT * FROM users WHERE Username = ?")) {
            ps.setString(1, username);
            ResultSet rs = ps.executeQuery();
            if (rs.next()) {
                return populateUser(rs);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }


    /**
     * 添加新的用户记录。
     *
     * @param user 新的用户记录对象。
     */
    public void add(User user) {
        try (Connection conn = C3P0Util.getConnection();
             PreparedStatement ps = conn.prepareStatement(
                     "INSERT INTO users (Username, Password, RegistrationDate, LastLoginDate, UserType, Email, Title, IsLocked, IsRegistrationComplete) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)",
                     Statement.RETURN_GENERATED_KEYS)) {
            ps.setString(1, user.getUsername());
            ps.setString(2, user.getPassword());
            ps.setDate(3, new java.sql.Date(user.getRegistrationDate().getTime()));
            ps.setDate(4, user.getLastLoginDate() != null ? new java.sql.Date(user.getLastLoginDate().getTime()) : null);
            ps.setInt(5, user.getUserType());
            ps.setString(6, user.getEmail());
            ps.setString(7, user.getTitle());
            ps.setBoolean(8, user.isLocked());
            ps.setBoolean(9, user.isRegistrationComplete());

            ps.executeUpdate();

            ResultSet generatedKeys = ps.getGeneratedKeys();
            if (generatedKeys.next()) {
                user.setUserID(generatedKeys.getInt(1));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    /**
     * 更新现有的用户记录。
     *
     * @param user 要更新的用户记录对象。
     */
    public void update(User user) {
        try (Connection conn = C3P0Util.getConnection();
             PreparedStatement ps = conn.prepareStatement(
                     "UPDATE users SET Username=?, Password=?, RegistrationDate=?, LastLoginDate=?, UserType=?, Email=?, Title=?, IsLocked=?, IsRegistrationComplete=? WHERE UserID=?")) {
            ps.setString(1, user.getUsername());
            ps.setString(2, user.getPassword());
            ps.setDate(3, new java.sql.Date(user.getRegistrationDate().getTime()));
            ps.setDate(4, user.getLastLoginDate() != null ? new java.sql.Date(user.getLastLoginDate().getTime()) : null);
            ps.setInt(5, user.getUserType());
            ps.setString(6, user.getEmail());
            ps.setString(7, user.getTitle());
            ps.setBoolean(8, user.isLocked());
            ps.setBoolean(9, user.isRegistrationComplete());
            ps.setInt(10, user.getUserID());

            ps.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    /**
     * 删除指定ID的用户记录。
     *
     * @param id 要删除的用户记录的ID。
     */
    public void delete(int id) {
        try (Connection conn = C3P0Util.getConnection();
             PreparedStatement ps = conn.prepareStatement("DELETE FROM users WHERE UserID = ?")) {
            ps.setInt(1, id);
            ps.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    /**
     * 从ResultSet中填充并返回一个新的User对象。
     *
     * @param rs ResultSet对象，包含一行数据。
     * @return 填充后的User对象。
     * @throws SQLException 如果读取ResultSet时发生错误。
     */
    private User populateUser(ResultSet rs) throws SQLException {
        User user = new User();
        user.setUserID(rs.getInt("UserID"));
        user.setUsername(rs.getString("Username"));
        user.setPassword(rs.getString("Password"));
        user.setRegistrationDate(rs.getDate("RegistrationDate"));
        user.setLastLoginDate(rs.getDate("LastLoginDate"));
        user.setUserType(rs.getInt("UserType"));
        user.setEmail(rs.getString("Email"));
        user.setTitle(rs.getString("Title"));
        user.setLocked(rs.getBoolean("IsLocked"));
        user.setRegistrationComplete(rs.getBoolean("IsRegistrationComplete"));
        return user;
    }

}